/**
 * 通用组件类型定义
 */

/**
 * 表格列配置
 */
export interface TableColumn {
  /** 列属性名 */
  prop: string
  /** 列标题 */
  label: string
  /** 列宽度 */
  width?: string | number
  /** 最小列宽度 */
  minWidth?: string | number
  /** 是否固定列 */
  fixed?: boolean | 'left' | 'right'
  /** 是否支持排序 */
  sortable?: boolean | 'custom'
  /** 对齐方式 */
  align?: 'left' | 'center' | 'right'
  /** 列类型 */
  type?: 'selection' | 'index' | 'expand'
  /** 格式化函数 */
  formatter?: (row: any, column: any, cellValue: any, index: number) => string
  /** 自定义列模板 */
  slot?: string
  /** 是否显示 */
  show?: boolean
  /** 是否支持多级表头 */
  children?: TableColumn[]
}

/**
 * 表格操作按钮
 */
export interface TableAction {
  /** 按钮类型 */
  type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
  /** 按钮文字 */
  text: string
  /** 按钮图标 */
  icon?: string
  /** 显示条件函数 */
  show?: (row: any, index: number) => boolean
  /** 禁用条件函数 */
  disabled?: (row: any, index: number) => boolean
  /** 点击事件处理函数 */
  handler: (row: any, index: number) => void
  /** 权限标识 */
  permission?: string
}

/**
 * 表单字段配置
 */
export interface FormField {
  /** 字段名 */
  prop: string
  /** 字段标签 */
  label: string
  /** 字段类型 */
  type: 'input' | 'textarea' | 'select' | 'radio' | 'checkbox' | 'date' | 'number' | 'password'
  /** 占位符 */
  placeholder?: string
  /** 是否必填 */
  required?: boolean
  /** 是否禁用 */
  disabled?: boolean
  /** 是否只读 */
  readonly?: boolean
  /** 选项列表（select、radio、checkbox使用） */
  options?: Array<{ label: string; value: any }>
  /** 验证规则 */
  rules?: any[]
  /** 默认值 */
  default?: any
  /** 显示条件 */
  show?: (formData: any) => boolean
  /** 字段宽度 */
  span?: number
  /** 提示信息 */
  tip?: string
}

/**
 * 对话框配置
 */
export interface DialogConfig {
  /** 标题 */
  title: string
  /** 宽度 */
  width?: string | number
  /** 是否全屏 */
  fullscreen?: boolean
  /** 是否可通过点击遮罩关闭 */
  closeOnClickModal?: boolean
  /** 是否可通过按ESC关闭 */
  closeOnPressEscape?: boolean
  /** 是否显示关闭按钮 */
  showClose?: boolean
  /** 自定义类名 */
  customClass?: string
}

/**
 * 搜索表单配置
 */
export interface SearchField {
  /** 字段名 */
  prop: string
  /** 字段标签 */
  label: string
  /** 字段类型 */
  type: 'input' | 'select' | 'date' | 'daterange'
  /** 占位符 */
  placeholder?: string
  /** 选项列表 */
  options?: Array<{ label: string; value: any }>
  /** 默认值 */
  default?: any
}